package cn.git;

import net.bytebuddy.implementation.bind.annotation.*;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Callable;

public class UserManagerStatic {

    /**
     * 被标注 RuntimeType 注解的方法就是拦截方法，此时返回的值与返回参数可以与被拦截的方法不一致
     * byteBuddy会在运行期间给被拦截的方法参数进行赋值
     * @return
     */
    @RuntimeType
    public Object diffNameMethod(
            // 被拦截的目标对象,静态方法只能拿取到class类对象，拿取不到This对象
            @Origin Class<?> targetClass,
            // 被拦截的目标方法,拦截实例方法以及静态方法有效
            @Origin Method targetMethod,
            // 被拦截的目标方法参数,拦截实例方法以及静态方法有效
            @AllArguments Object[] targetMethodArgs,
            // 用于调用目标方法
            @SuperCall Callable<?> superCall) {
        // cn.git.budy.test.BuddyUserManager@a1f72f5
        System.out.println("targetClass : " + targetClass);
        // selectUserName
        System.out.println("targetMethodName : " + targetMethod.getName());
        // [1521]
        System.out.println("targetMethodArgs : " + Arrays.toString(targetMethodArgs));
        Object call;
        try {
            // 调用目标方法,打印 用户id:1521的名字为:030a0667-b02b-4795-bcc7-3b99c84f18c4
            // 不可以使用 targetMethod.invoke 会引起递归调用
            call = superCall.call();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return call;
    }

}
